
--封装
Object = {}

function Object:new()

	local newObj = {}
	--self == Object表 把类自身的方法和属性设置为元表的__index元方法
	self.__index =self
	--这样后子表设置元表之后 如果子表没有相关属性就会去元表找
	setmetatable(newObj,self)

	return newObj

end


--继承 通过_G表把字符串转为一个对象
function Object:subClass(className)

	_G[className] = {}

	local subObj = _G[className] 

	--基方法 用于实现多态 意思是将Object 给到className.base变量
	subObj.base =self

	--self == Object表 把类自身的方法和属性设置为元表的__index元方法
	self.__index =self
	
	--这样后子表设置元表之后 如果子表没有相关属性就会去元表找
	setmetatable(subObj,self)

end

------使用------

--继承
Object :subClass("GameObject")

GameObject.posX=0;

function GameObject:Move()
	self.posX =self.posX+1
end

--new对象
local Go1 =GameObject:new()
Go1:Move()
print(Go1.posX);

--多态

GameObject :subClass("GameMethod")

local Gm1 = GameMethod:new()
local Gm2 = GameMethod:new()

function GameMethod:Move() --给GameMethod重写Move方法

	self.base.Move(self) --保留基类方法 等价于 GameObject.Move(Gm1)

	--self.base:Move() --这么写需要给每个实例都添加一个变量

	self.posX = self.posX +100;
	--print("重写后会打印这句话");
end

Gm1:Move(); --101
Gm1:Move(); --202
Gm1:Move(); --303

Gm2:Move(); --101
Gm2:Move(); --202

print("Go1的参数:"..Go1.posX);
print("Gm1的参数:"..Gm1.posX);
print("Gm2的参数:"..Gm2.posX);
